/**
 * 通用格式化工具
 */

/**
 * 格式化日期
 * @param date Date 或 时间戳
 * @param fmt 格式字符串，默认 'yyyy-MM-dd HH:mm:ss'
 * @returns 格式化后的字符串
 */
export function formatDate(date: Date | number, fmt = 'yyyy-MM-dd HH:mm:ss'): string {
  const d = date instanceof Date ? date : new Date(date)
  const o: Record<string, number> = {
    'M+': d.getMonth() + 1,
    'd+': d.getDate(),
    'H+': d.getHours(),
    'm+': d.getMinutes(),
    's+': d.getSeconds(),
  }

  let result = fmt
  if (/(y+)/.test(fmt)) {
    result = result.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length))
  }

  for (const k in o) {
    if (new RegExp(`(${k})`).test(result)) {
      const val = o[k] + ''
      result = result.replace(RegExp.$1, RegExp.$1.length === 1 ? val : val.padStart(2, '0'))
    }
  }
  return result
}

/**
 * 格式化金额
 * @param amount 金额数字
 * @param decimal 小数位数，默认2位
 * @returns 格式化后的金额字符串
 */
export function formatMoney(amount: number, decimal = 2): string {
  if (isNaN(amount)) return '0.00'
  return amount.toFixed(decimal).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}

/**
 * 格式化百分比
 * @param value 数字，例如 0.123
 * @param decimal 小数位数，默认2位
 * @returns 百分比字符串，例如 '12.30%'
 */
export function formatPercent(value: number, decimal = 2): string {
  if (isNaN(value)) return '0%'
  return (value * 100).toFixed(decimal) + '%'
}

/**
 * 首字母大写
 */
export function capitalize(str: string): string {
  if (!str) return ''
  return str.charAt(0).toUpperCase() + str.slice(1)
}

/**
 * 字符串截断，超出部分用省略号
 */
export function truncate(str: string, length: number): string {
  if (!str) return ''
  return str.length > length ? str.slice(0, length) + '...' : str
}
